TCH-Thomas Posted September 1, 2004 Posted September 1, 2004 I finally found a rss reader I understand I think. It works when I try the downloaded "default" code, but not when I replace the url I want to get news from (http://expressen.se/rss/nyheter'>http://expressen.se/rss/nyheter). When I replace the default url I get this error: Warning: fopen(http://expressen.se/rss/nyheter ): failed to open stream: HTTP request failed! HTTP/1.0 404 in /home/cpanelusername/public_html/test/index.html on line 649could not open XML input Does anyone know why? Here is the original code ><?php /* PHP RSS Reader v1.1 By Richard James Kendall Bugs to richard@richardjameskendall.com Free to use, please acknowledge me Place the URL of an RSS feed in the $file variable. The $rss_channel array will be filled with data from the feed, every RSS feed is different by by and large it should contain: Array { [TITLE] = feed title [DESCRIPTION] = feed description [LINK] = link to their website [IMAGE] = Array { [URL] = url of image [DESCRIPTION] = alt text of image } [ITEMS] = Array { [0] = Array { [TITLE] = item title [DESCRIPTION] = item description [LINK = a link to the story } . . . } } By default it retrives the Reuters Oddly Enough RSS feed. The data is put into the array structure so you can format the information as you see fit. */ set_time_limit(0); $file = "http://slashdot.org/index.rss"; $rss_channel = array(); $currently_writing = ""; $main = ""; $item_counter = 0; function startElement($parser, $name, $attrs) { global $rss_channel, $currently_writing, $main; switch($name) { case "RSS": case "RDF:RDF": case "ITEMS": $currently_writing = ""; break; case "CHANNEL": $main = "CHANNEL"; break; case "IMAGE": $main = "IMAGE"; $rss_channel["IMAGE"] = array(); break; case "ITEM": $main = "ITEMS"; break; default: $currently_writing = $name; break; } } function endElement($parser, $name) { global $rss_channel, $currently_writing, $item_counter; $currently_writing = ""; if ($name == "ITEM") { $item_counter++; } } function characterData($parser, $data) { global $rss_channel, $currently_writing, $main, $item_counter; if ($currently_writing != "") { switch($main) { case "CHANNEL": if (isset($rss_channel[$currently_writing])) { $rss_channel[$currently_writing] .= $data; } else { $rss_channel[$currently_writing] = $data; } break; case "IMAGE": if (isset($rss_channel[$main][$currently_writing])) { $rss_channel[$main][$currently_writing] .= $data; } else { $rss_channel[$main][$currently_writing] = $data; } break; case "ITEMS": if (isset($rss_channel[$main][$item_counter][$currently_writing])) { $rss_channel[$main][$item_counter][$currently_writing] .= $data; } else { //print ("rss_channel[$main][$item_counter][$currently_writing] = $data<br>"); $rss_channel[$main][$item_counter][$currently_writing] = $data; } break; } } } $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterData"); if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } xml_parser_free($xml_parser); // output as HTML print ("<html><head><title>PHP RSS Reader</title></head><body>"); if (isset($rss_channel["IMAGE"])) { print ("<a href=\"" . $rss_channel["LINK"] . "\" target=\"_blank\"><img border=\"0\" src=\"" . $rss_channel["IMAGE"]["URL"] . "\" align=\"middle\" alt=\"" . $rss_channel["IMAGE"]["TITLE"] . "\"></a> <font size=\"5\">" . $rss_channel["TITLE"] . "</font><br><br>"); } else { print ("<font size=\"5\">" . $rss_channel["TITLE"] . "</font><br><br>"); } print ("<i>" . $rss_channel["DESCRIPTION"] . "</i><br><br>"); if (isset($rss_channel["ITEMS"])) { if (count($rss_channel["ITEMS"]) > 0) { for($i = 0;$i < count($rss_channel["ITEMS"]);$i++) { print ("\n<table width=\"100%\" border=\"1\"><tr><td width=\"100%\"><a href=\"" . $rss_channel["ITEMS"][$i]["LINK"] . "\" target=\"_blank\"><h2>" . $rss_channel["ITEMS"][$i]["TITLE"] . "</h2></a></b>"); print ("<i>" . html_entity_decode($rss_channel["ITEMS"][$i]["DESCRIPTION"]) . "</i>"); print ("</td></tr></table><br>"); } } else { print ("<b>There are no articles in this feed.</b>"); } } print ("</body></html>"); ?> Quote
TCH-Thomas Posted September 1, 2004 Author Posted September 1, 2004 Its working now, but now I bumped in to a new problem. The text, especially the headings, are too big and I also would like to get rid of the borders around the items. Is there anyway I can change this? My RSS test page Quote
borfast Posted September 1, 2004 Posted September 1, 2004 Hi Thomas. I was going to tell you to try again, because what you were getting was a "404 page not found" error but then I tried accessing the URL and it was working. As for your other question, see that "// output as HTML" line, near the bottom of the script? You can edit the HTML code you see after that to make the page look as you want. Quote
TCH-Thomas Posted September 1, 2004 Author Posted September 1, 2004 Thanks Raul I tried it a little. Not going to well, but I´ll keep trying. Quote
borfast Posted September 1, 2004 Posted September 1, 2004 Well, here's a few tips: change the <h2> into <h3> to make the text smaller. Or simply remove it if you want it to be the same size of the rest of the text. If you really want to control the size, try replacing the <h2> with <span style='font-size: 1em;'> Don't forget to close those tags! About the borders around the items, it's simple, just replace border=\"1\" with style='border: 0;' Let me know if it does the trick Quote
TCH-Thomas Posted September 1, 2004 Author Posted September 1, 2004 (edited) Thanks Raul, that works. :-) You rock!!! EDIT: I thought I should change h2 to h1 to get it smaller. Now I know. Edited September 1, 2004 by Jikrantz Quote
LisaJill Posted September 1, 2004 Posted September 1, 2004 h stands for heading, it's semantic markup and can be used for accessibility purposes. But basically it means "heading 1", "heading 2" etc. That's why the heading 1 is bigger and generally gets smaller - but you can style this using css if you want =) Quote
TCH-Thomas Posted September 1, 2004 Author Posted September 1, 2004 Uh oh... I need to learn CSS then. I will... soon. Thanks Lisa Quote
TCH-Thomas Posted September 2, 2004 Author Posted September 2, 2004 Can I somehow use the above code to show 2 different feeds? What I want to do is to show both the top news and international feeds from reuters.com on same page. Quote
borfast Posted September 2, 2004 Posted September 2, 2004 I think you'd have to duplicate the code, Thomas. Quote
TCH-Thomas Posted September 2, 2004 Author Posted September 2, 2004 I thought it should be that easy, so I tried, but then it gave me errors for the second feed. Quote
borfast Posted September 2, 2004 Posted September 2, 2004 What errors did it return? And how did you duplicate the code? It should be as easy as copying the whole block, pasting it below the one already there and changing the URL. Quote
TCH-Thomas Posted September 2, 2004 Author Posted September 2, 2004 I just copied it all, replaced the url and got this mesage: >Fatal error: Cannot redeclare startelement() (previously declared in /home/jikrant/public_html/test/rsstest.htm:72) in /home/jikrant/public_html/test/rsstest.htm on line 226 Quote
borfast Posted September 2, 2004 Posted September 2, 2004 I feel really stupid... Those are functions, so of course you can't duplicate them Try this: Just before the line $xml_parser = xml_parser_create(); Put the new RSS feed URL. Something like $file = "http://newsiteorg/feed.rss"; After that, duplicate all the code, starting from the line I mentioned before (including that line) to the end of the code. Quote
TCH-Thomas Posted September 2, 2004 Author Posted September 2, 2004 Thanks Raul. Will try it a little later today. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.